import tkinter as tk
from tkinter import ttk
from tkinter import messagebox

def initialize_dropdowns(parent, equipment_name, prefix_options, suffix_options):
    """
    初始化给定装备的下拉列表，并设置文本显示区域以及词缀的选择限制。
    
    参数:
        parent: 父容器对象。
        equipment_name: 装备名称。
        prefix_options: 前缀选项列表。
        suffix_options: 后缀选项列表。
    
    返回:
        combos: 下拉列表对象列表。
        text_display: 文本显示区域对象。
        selected: 已选择的词条集合（针对当前装备）。
        advanced_selected: 已选择的进阶词缀集合（针对当前装备）。
        supreme_selected: 已选择的至臻词缀集合（针对当前装备）。
        attribute_selected: 已选择的主属性。
    """
    tab = parent.tabs[equipment_name]  # 获取对应装备的标签页
    right_frame = tk.Frame(tab)
    right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
    
    text_display = tk.Text(right_frame, width=30, height=20, wrap=tk.WORD)
    text_display.pack(padx=10, pady=(35, 0))
    text_display.configure(state='disabled')  # 禁止用户编辑

    left_frame = tk.Frame(tab)
    left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=(10, 0), pady=(10, 10))

    combos = []  # 存储下拉框对象
    selected = set()  # 针对当前装备的已选择词条集合
    advanced_selected = set()  # 针对当前装备的已选择进阶词缀集合
    supreme_selected = set()  # 针对当前装备的已选择至臻词缀集合
    attribute_selected = None  # 已选择的主属性

    # 创建前缀下拉框
    for i in range(3):  # 前缀下拉框
        var = tk.StringVar(value='')
        label = tk.Label(left_frame, text=f"前缀{i+1}")
        label.pack(pady=2)
        combo = ttk.Combobox(left_frame, textvariable=var, values=prefix_options, width=40, state='readonly')
        combo.pack(pady=2)
        combo.bind('<<ComboboxSelected>>', lambda event, cb=combo: on_combobox_select(event, cb, combos, text_display, selected, advanced_selected, supreme_selected, attribute_selected))
        combos.append(combo)

    # 创建后缀下拉框
    for i in range(3, 6):  # 后缀下拉框
        var = tk.StringVar(value='')
        label = tk.Label(left_frame, text=f"后缀{i-2+1}")
        label.pack(pady=2)
        combo = ttk.Combobox(left_frame, textvariable=var, values=suffix_options, width=40, state='readonly')
        combo.pack(pady=2)
        combo.bind('<<ComboboxSelected>>', lambda event, cb=combo: on_combobox_select(event, cb, combos, text_display, selected, advanced_selected, supreme_selected, attribute_selected))
        combos.append(combo)

    # 添加新的下拉选项框
    if equipment_name in ["主手", "副手"]:
        new_label = tk.Label(right_frame, text="武器类型")
        new_label.pack(pady=(50, 0))  # 距离文本框y=50的位置
        new_var = tk.StringVar(value='')
        new_combo = ttk.Combobox(right_frame, textvariable=new_var, values=["双手剑", "双手锤", "双手斧", "弓", "火枪", "炮", "弩", "锡杖", "武仗", "匕首", "爪", "单手锤", "单手剑", "单手斧", "手枪", "法杖", "手仗", "魔杖", "灵仗", "力量盾牌", "敏捷盾牌", "智慧盾牌"], width=40, state='readonly')
        new_combo.pack(pady=2)
        combos.append(new_combo)  # 将新下拉框加入到 combos 列表中

    return combos, text_display, selected, advanced_selected, supreme_selected, attribute_selected
    
def on_combobox_select(event, combo, combos, text_display, selected, advanced_selected, supreme_selected, attribute_selected):
    """
    处理下拉框选择事件，并根据选择更新其他下拉框的选项和文本显示区域。
    
    参数:
        event: 事件对象。
        combo: 被选择的下拉框对象。
        combos: 所有下拉框对象列表。
        text_display: 文本显示区域对象。
        selected: 已选择的词条集合（针对当前装备）。
        advanced_selected: 已选择的进阶词缀集合（针对当前装备）。
        supreme_selected: 已选择的至臻词缀集合（针对当前装备）。
        attribute_selected: 已选择的主属性。
    """
    selected_value = combo.get()
    if selected_value:
        if selected_value in selected:
            combo.set('')  # 清空已选择的词缀
            messagebox.showwarning("错误", "不能重复选择相同的词缀")
            return
        is_advanced = "进阶词缀" in selected_value
        is_supreme = "至臻词缀" in selected_value
        if is_advanced and len(advanced_selected) >= 2:
            combo.set('')  # 清空已选择的词缀
            messagebox.showwarning("错误", "每件装备最多只能选择2条进阶词缀")
            return
        if is_supreme and len(supreme_selected) >= 2:
            combo.set('')  # 清空已选择的词缀
            messagebox.showwarning("错误", "每件装备最多只能选择2条至臻词缀")
            return
        if attribute_selected and not (is通用词缀(selected_value) or attribute_selected in selected_value):
            combo.set('')  # 清空已选择的词缀
            messagebox.showwarning("错误", f"选择了{attribute_selected}词缀后，只能选择{attribute_selected}或通用词缀")
            return
        selected.add(selected_value)
        if is_advanced:
            advanced_selected.add(selected_value)
        if is_supreme:
            supreme_selected.add(selected_value)
        if "力量" in selected_value:
            attribute_selected = "力量"
        elif "敏捷" in selected_value:
            attribute_selected = "敏捷"
        elif "智慧" in selected_value:
            attribute_selected = "智慧"
        update_combobox_values(combos, selected_value, attribute_selected)
        update_text_display(combos, text_display)

def is通用词缀(suffix):
    return "通用" in suffix

def is力量词缀(suffix):
    return "力量" in suffix

def is敏捷词缀(suffix):
    return "敏捷" in suffix

def is智慧词缀(suffix):
    return "智慧" in suffix

def update_combobox_values(combos, selected_value, attribute_selected):
    """
    更新其他下拉框的选项，移除已选择的词缀。
    
    参数:
        combos: 所有下拉框对象列表。
        selected_value: 被选择的词缀值。
        attribute_selected: 已选择的主属性。
    """
    for combo in combos:
        if combo != combo:
            combo['values'] = [value for value in combo['values'] if value != selected_value or is通用词缀(value)]
            if attribute_selected:
                combo['values'] = [value for value in combo['values'] if attribute_selected in value or is通用词缀(value)]

def update_text_display(combos, text_display):
    """
    更新文本显示区域，显示所有已选择的词缀。
    
    参数:
        combos: 所有下拉框对象列表。
        text_display: 文本显示区域对象。
    """
    selected_values = [combo.get() for combo in combos if combo.get()]
    text_display.configure(state='normal')
    text_display.delete('1.0', tk.END)
    for value in selected_values:
        text_display.insert(tk.END, value + '\n')
    text_display.configure(state='disabled')

def handle_invalid_selection(combo):
    """
    处理无效选择。
    
    参数:
        combo: 被选择的下拉框对象。
    """
    combo.set('')  # 清空已选择的词缀
    tk.messagebox.showwarning("错误", "不能重复选择相同的词缀")